PHP
提供的MySQL
、CURL
、Redis
等客户端是同步的,会导致服务器程序发生阻塞。Swoole
提供了常用的异步客户端组件,来解决此问题。编写纯异步服务器程序时,可以使用这些异步客户端。
异步客户端可以配合使用SplQueue
实现连接池,以达到长连接复用的目的。在实际项目中可以使用PHP
提供的Yield/Generator
语法实现半协程的异步框架。也可以基于Promises
简化异步程序的编写。
$db = new Swoole\MySQL;
$server = array(
'host' => '127.0.0.1',
'user' => 'test',
'password' => 'test',
'database' => 'test',
);
$db->connect($server, function ($db, $result) {
$db->query("show tables", function (Swoole\MySQL $db, $result) {
var_dump($result);
$db->close();
});
});
与mysqli
和PDO
等客户端不同,Swoole\MySQL
是异步非阻塞的,连接服务器、执行SQL时,需要传入一个回调函数。connect
的结果不在返回值中,而是在回调函数中。query
的结果也需要在回调函数中进行处理。
$redis = new Swoole\Redis;
$redis->connect('127.0.0.1', 6379, function ($redis, $result) {
$redis->set('test_key', 'value', function ($redis, $result) {
$redis->get('test_key', function ($redis, $result) {
var_dump($result);
});
});
});
Swoole\Redis
需要Swoole
编译安装hiredis
,详细文档参见异步Redis客户端
$cli = new Swoole\Http\Client('127.0.0.1', 80);
$cli->setHeaders(array('User-Agent' => 'swoole-http-client'));
$cli->setCookies(array('test' => 'value'));
$cli->post('/dump.php', array("test" => 'abc'), function ($cli) {
var_dump($cli->body);
$cli->get('/index.php', function ($cli) {
var_dump($cli->cookies);
var_dump($cli->headers);
});
});
Swoole\Http\Client
的作用与CURL
完全一致,它完整实现了Http
客户端的相关功能。具体请参考 HttpClient文档
Swoole
底层目前只提供了最常用的MySQL
、Redis
、Http
异步客户端,如果你的应用程序中需要实现其他协议客户端,如Kafka
、AMQP
等协议,可以基于Swoole\Client
异步TCP
客户端,开发相关协议解析代码,来自行实现。